package commonType

import (
	"go.mongodb.org/mongo-driver/bson/primitive"
)

type TaskDTO struct {
	Name        string        `bson:"name" json:"name"`
	ApiDoc      string        `bson:"api_doc,omitempty" json:"api_doc"`
	TraceTree   TraceTree     `bson:"trace_tree" json:"trace_tree"`
	SelectedReq SelectedReq   `bson:"selected_req" json:"selected_req"`
	FaultConfig []FaultConfig `bson:"fault_config" json:"fault_config"`
	Creator     string        `bson:"creator" json:"creator"`
	NameSpace   string        `bson:"namespace" json:"namespace"`
	CreateTime  string        `bson:"create_time" json:"create_time"`
}

type Task struct {
	ID          *primitive.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
	Name        string              `bson:"name" json:"name"`
	ApiDoc      *primitive.ObjectID `bson:"api_doc,omitempty" json:"api_doc,omitempty"`
	TraceTree   TraceTree           `bson:"trace_tree" json:"trace_tree"`
	SelectedReq SelectedReq         `bson:"selected_req" json:"selected_req"`
	FaultConfig []FaultConfig       `bson:"fault_config" json:"fault_config"`
	Creator     string              `bson:"creator" json:"creator"`
	NameSpace   string              `bson:"namespace" json:"namespace"`
	CreateTime  string              `bson:"create_time" json:"create_time"`
}

type TaskPageDto struct {
	Tasks []Task `json:"tasks"`
	Total int    `json:"total"`
}

type SelectedReq struct {
	URL         string                 `bson:"url" json:"url"`
	Method      string                 `bson:"method" json:"method"`
	Header      map[string]string      `bson:"header" json:"header"`
	Data        map[string]interface{} `bson:"data" json:"data"`
	Params      map[string]interface{} `bson:"params" json:"params"`
	ServiceName string                 `bson:"service_name" json:"service_name"`
	Namespace   string                 `bson:"namespace" json:"namespace"`
	// TODO 二进制请求体
}

type Request struct {
	URL    string                 `bson:"url" json:"url"`
	Method string                 `bson:"method" json:"method"`
	Header map[string]interface{} `bson:"header" json:"header"`
	Data   map[string]interface{} `bson:"data" json:"data"`
}
type TraceTree struct {
	Nodes []Node `bson:"nodes" json:"nodes"`
	Edges []Edge `bson:"edges" json:"edges"`
}

type Node struct {
	ID           int       `bson:"id" json:"id"`
	PodName      string    `bson:"pod_name" json:"pod_name"`
	ServiceName  string    `bson:"service_name" json:"service_name"`
	TraceRequest []Request `bson:"trace_request" json:"trace_request"`
}

type Edge struct {
	Source int `bson:"source" json:"source"`
	Target int `bson:"target" json:"target"`
}

type FaultConfig struct {
	ServiceName string  `bson:"service_name" json:"service_name"`
	FaultList   []Fault `bson:"fault_list" json:"fault_list"`
}

type Fault struct {
	ChaosType string      `bson:"chaosType" json:"chaosType"`
	Define    interface{} `bson:"define" json:"define"`
}

type ErrorResponse struct {
	Error   string `json:"error"`
	Message string `json:"message"`
}

type SuccessResponse struct {
	Status  int         `json:"status"`  // HTTP状态码
	Message string      `json:"message"` // 描述信息
	Data    interface{} `json:"data"`    // 返回的数据
}

type Record struct {
	ID        *primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
	TaskID    *primitive.ObjectID `bson:"task_id" json:"task_id"`
	Executor  string              `bson:"executor" json:"executor"`
	StartTime string              `bson:"start_time" json:"start_time"`
	EndTime   string              `bson:"end_time,omitempty" json:"end_time"`
	Status    Status              `bson:"status" json:"status"`
}

type RecordPageDTO struct {
	PageSum int `bson:"page_sum"  json:"page_sum"`
	Total   int `json:"total"`
}

type Status int

const (
	// StatusRunning 进行中
	StatusRunning Status = iota + 1
	// StatusSuccess 执行成功
	StatusSuccess
	// StatusFailed 执行失败
	StatusFailed
)

type TestMicroservice struct {
	ID           *primitive.ObjectID `json:"_id,omitempty" bson:"_id"`
	RecordID     *primitive.ObjectID `json:"record_id,omitempty" bson:"record_id"`
	Name         string              `json:"name" bson:"name"`
	TestStatus   int                 `json:"testStatus" bson:"testStatus"`
	FaultList    []Fault             `bson:"fault_list" json:"fault_list"`
	TraceRequest []Request           `bson:"trace_request" json:"trace_request"`
}

type ServiceStatus struct {
	ServiceName string `json:"servicename"`
	Status      int    `json:"status"`
}

type StoredResponse struct {
	StatusCode int `json:"statusCode" bson:"statusCode"`
	//Headers    map[string]interface{} `json:"headers" bson:"headers"`
	Body map[string]interface{} `json:"body" bson:"body"` // 假设响应体可以转换为字符串
}

type TestCase struct {
	ID                 *primitive.ObjectID `json:"_id,omitempty" bson:"_id"`
	TestMicroserviceID *primitive.ObjectID `json:"testMicroservice_id,omitempty" bson:"testMicroservice_id"`
	SelectedReq        Request             `json:"selectedReq" bson:"selectedReq"`
	SelectedFault      Fault               `json:"selectedFault" bson:"selectedFault"`
	Dependency         []TestCase          `json:"dependency,omitempty" bson:"dependency"`
	Status             int                 `json:"status" bson:"status"`
	Response           StoredResponse      `json:"response" bson:"response"`
}

type TraceItem struct {
	TraceID   string             `json:"traceID"`
	Spans     []Span             `json:"spans"`
	Processes map[string]Process `json:"processes"`
}
type Span struct {
	TraceID       string      `json:"traceID"`
	SpanID        string      `json:"spanID"`
	OperationName string      `json:"operationName"`
	References    []Reference `json:"references"`
	StartTime     int64       `json:"startTime"`
	Duration      int64       `json:"duration"`
	Tags          []Tag       `json:"tags"`
	ProcessID     string      `json:"processID"`
}
type Tag struct {
	Key   string `json:"key"`
	Value string `json:"value"`
	Type  string `json:"type"`
}

type Process struct {
	ServiceName string `json:"serviceName"`
	Tags        []Tag  `json:"tags"`
}

type Reference struct {
	RefType string `json:"refType"`
	TraceID string `json:"traceID"`
	SpanID  string `json:"spanID"`
}

type TraceRequestList struct {
	PodName       string    `json:"podname"`
	TraceRequests []Request `json:"trace_request"`
}
type TraceRequestItem struct {
	URL    string                 `json:"url"`
	Method string                 `json:"method"`
	Header map[string]interface{} `json:"header"`
	Data   map[string]interface{} `json:"data"`
}

type PodInfo struct {
	PodName  string   `json:"podname"`
	SpanList []string `json:"spanlist"`
}

type RequestData struct {
	ServiceName   string        `json:"servicename"`
	Namespace     string        `json:"namespace"`
	RequestDefine RequestDefine `json:"requestDefine"`
}

type RequestDefine struct {
	URL    string                 `json:"url"`
	Method string                 `json:"method"`
	Header map[string]interface{} `json:"header"`
	Data   map[string]interface{} `json:"data"`
}

type ApiDocDTO struct {
	ID *primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
	// 请求名称
	RequestName string `bson:"requestName" json:"requestName"`
	// 请求定义
	RequestDefinition RequestDefinition `bson:"requestDefinition" json:"requestDefinition"`
	// 请求描述
	RequestDescription string `bson:"requestDescription" json:"requestDescription"`
}

type RequestDefinition struct {
	// 请求地址
	URL string `bson:"url" json:"url"`
	// 请求方法
	Method string `bson:"method" json:"method"`
	// 请求头
	Header map[string]string `bson:"header" json:"header"`
	// 请求参数
	Params map[string]Param `bson:"params" json:"params"`
}

type Param struct {
	// 参数描述
	Description string `bson:"description" json:"description"`
	// 是否必须
	Required bool `bson:"required" json:"required"`
	// 参数类型 FIXME 怎么用
	Type string `bson:"type" json:"type"`
}
